typedef pair<pair<int,int>,int>Pii;
const int maxn=105;
int dx[4]={0,0,1,-1}, dy[4]={1,-1,0,0};
bool cmp(const vector<int>& v1, const vector<int>& v2){
    if(v1[0]==v2[0]) return v1[1]<v2[1];
    else return v1[0]<v2[0];
}
set<int> map1[maxn][maxn];
queue<Pii>que;
class Solution {
public:
    vector<vector<int>> bicycleYard(vector<int>& po, vector<vector<int>>& te, vector<vector<int>>& ob) {
        while(!que.empty())que.pop();
        int n=te.size(); int m=te[0].size();
        que.push({{po[0],po[1]},1});
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                map1[i][j].clear();
            }
        }
        vector<vector<int>>ans;
        while(!que.empty()){
            Pii now=que.front();que.pop();
            int nx=now.first.first;
            int ny=now.first.second;
            int nval=now.second;
            for(int i=0;i<4;i++){
                int tx=nx+dx[i];
                int ty=ny+dy[i];
                if(tx<0||tx>=n||ty<0||ty>=m) continue;
                int tval=nval+te[nx][ny]-te[tx][ty]-ob[tx][ty];
                if(tval<=0) continue;
                if(map1[tx][ty].count(tval)) continue;
                if(tval==1){
                    if(tx!=po[0]||ty!=po[1]){
                        vector<int>v(2,0);
                        v[0]=tx;v[1]=ty;
                        ans.push_back(v);
                    }
                }
                map1[tx][ty].insert(tval);
                que.push({{tx,ty},tval});
            }
        }
        sort(ans.begin(),ans.end(),cmp);
        return ans;
    }
};